/**
 * JS常用全局方法
 * @author kevin 
 * 
 * */
Date.prototype.Format = function(fmt) { // author: meizz
	var o = {
		"M+" : this.getMonth() + 1, // 月份
		"d+" : this.getDate(), // 日
		"H+" : this.getHours(), // 小时
		"m+" : this.getMinutes(), // 分
		"s+" : this.getSeconds(), // 秒
		"q+" : Math.floor((this.getMonth() + 3) / 3), // 季度
		"S" : this.getMilliseconds()// 毫秒
	};
	if (/(y+)/.test(fmt)){
		fmt = fmt.replace(RegExp.$1, (this.getFullYear() + "").substr(4 - RegExp.$1.length));
	}
		
	for ( var k in o){
		if (new RegExp("(" + k + ")").test(fmt)){
			fmt = fmt.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k])
					: (("00" + o[k]).substr(("" + o[k]).length)));
		}
	}
	return fmt;
} 

var GlobalJSModule = (function() {
	
	var result = {
			"code" : 0,
			"msg" : ""
	};
	
	handleButton = function (){
		
		
	};
	
		
	return {
		init : function(){
			handleButton();
		},
		/***********************************************************************
		 *银行卡号校验
		 *Description:  银行卡号Luhm校验
		 *Luhm校验规则：16位银行卡号（19位通用）:
		 * 1.将未带校验位的 15（或18）位卡号从右依次编号 1 到 15（18），位于奇数位号上的数字乘以 2。
		 * 2.将奇位乘积的个十位全部相加，再加上所有偶数位上的数字。
		 * 3.将加法和加上校验位能被 10 整除。
		 **********************************************************************/
		luhmCheck : function (bankno) {
		    if (bankno.length < 16 || bankno.length > 19) {
			  	GlobalJSModule.result = {"code": 1,"msg":"格式错误，银行卡号长度必须在16到19之间"};
			  	return GlobalJSModule.result;
			}
			var num = /^\d*$/; // 全数字
			if (!num.exec(bankno)) {
				GlobalJSModule.result = {"code": 1,"msg":"格式错误，银行卡号必须全为数字"};
			  	return GlobalJSModule.result;
			}
			// 开头6位
			var strBin = "10,18,30,35,37,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,58,60,62,65,68,69,84,87,88,94,95,98,99";
			if (strBin.indexOf(bankno.substring(0, 2)) == -1) {
				GlobalJSModule.result = {"code": 1,"msg":"银行卡号格式错误，请重新输入！"};
			  	return GlobalJSModule.result;
			}
			var lastNum = bankno.substr(bankno.length - 1, 1);// 取出最后一位（与luhm进行比较）

			var first15Num = bankno.substr(0, bankno.length - 1);// 前15或18位
			var newArr = new Array();
			for (var i = first15Num.length - 1; i > -1; i--) { // 前15或18位倒序存进数组
				newArr.push(first15Num.substr(i, 1));
			}
			var arrJiShu = new Array(); // 奇数位*2的积 <9
			var arrJiShu2 = new Array(); // 奇数位*2的积 >9

			var arrOuShu = new Array(); // 偶数位数组
			for (var j = 0; j < newArr.length; j++) {
				if ((j + 1) % 2 == 1) {// 奇数位
					if (parseInt(newArr[j]) * 2 < 9)
						arrJiShu.push(parseInt(newArr[j]) * 2);
					else
						arrJiShu2.push(parseInt(newArr[j]) * 2);
				} else
					// 偶数位
					arrOuShu.push(newArr[j]);
			}

			var jishu_child1 = new Array();// 奇数位*2 >9 的分割之后的数组个位数
			var jishu_child2 = new Array();// 奇数位*2 >9 的分割之后的数组十位数
			for (var h = 0; h < arrJiShu2.length; h++) {
				jishu_child1.push(parseInt(arrJiShu2[h]) % 10);
				jishu_child2.push(parseInt(arrJiShu2[h]) / 10);
			}

			var sumJiShu = 0; // 奇数位*2 < 9 的数组之和
			var sumOuShu = 0; // 偶数位数组之和
			var sumJiShuChild1 = 0; // 奇数位*2 >9 的分割之后的数组个位数之和
			var sumJiShuChild2 = 0; // 奇数位*2 >9 的分割之后的数组十位数之和
			var sumTotal = 0;
			for (var m = 0; m < arrJiShu.length; m++) {
				sumJiShu = sumJiShu + parseInt(arrJiShu[m]);
			}

			for (var n = 0; n < arrOuShu.length; n++) {
				sumOuShu = sumOuShu + parseInt(arrOuShu[n]);
			}

			for (var p = 0; p < jishu_child1.length; p++) {
				sumJiShuChild1 = sumJiShuChild1 + parseInt(jishu_child1[p]);
				sumJiShuChild2 = sumJiShuChild2 + parseInt(jishu_child2[p]);
			}
			// 计算总和
			sumTotal = parseInt(sumJiShu) + parseInt(sumOuShu)
					+ parseInt(sumJiShuChild1) + parseInt(sumJiShuChild2);

			// 计算Luhm值
			var k = parseInt(sumTotal) % 10 == 0 ? 10 : parseInt(sumTotal) % 10;
			var luhm = 10 - k;

			if (lastNum == luhm) {
				GlobalJSModule.result = {"code": 0,"msg":"Luhm验证通过"};
			  	return GlobalJSModule.result;
			} else {
				GlobalJSModule.result = {"code": 1,"msg":"银行卡号格式错误，请重新输入！"};
			  	return GlobalJSModule.result;
			}
		},
		/***********************************************************************
		 * 比较时间 
		 **********************************************************************/
		dateCompare : function(beginDate, endDate){
			var d1 = new Date(beginDate.replace(/\-/g, "\/"));  
			var d2 = new Date(endDate.replace(/\-/g, "\/"));  

			if(beginDate != "" && endDate != "" ){
				if(d1 >= d2){  
					//console.log("开始时间不能大于结束时间！");
				 	return 0;
				}else{
					return 1;
				}
			}else{
				console.log("请确认需要比较的时间为有效时间格式！");
				return -1;
			}
			
		},
		/***********************************************************************
		 * 获取当前的一星期前的时间 格式"yyyy-MM-dd HH:mm:ss"
		 **********************************************************************/
		getOneWeekAgoFormatDate : function(formater){
			var now = new Date();
			var oneWeekAgo = new Date(now.getTime() - 7 * 24 * 3600 * 1000);//一个星期前的时间
			if(GlobalJSModule.isEmpty(formater)){
				return oneWeekAgo.Format("yyyy-MM-dd HH:mm:ss");
			}
			return oneWeekAgo.Format(formater);
		},
		/***********************************************************************
		 * 获取当前的日期时间 
		 * 		格式"yyyy-MM-dd HH:mm:ss"
		 * 		格式"yyyy-MM-dd"
		 * 	第三方JS时间插件moment.min.js有更好的体验
		 **********************************************************************/
		getNowFormatDate : function(formater){
			if(GlobalJSModule.isEmpty(formater)){
				return new Date().Format("yyyy-MM-dd HH:mm:ss");
			}
			return new Date().Format(formater);
		},
		/***********************************************************************
		 * 获取昨天的日期 
		 * 		格式：2017-09-29
		 **********************************************************************/
		getTomorrowFormatDate : function(){
			var date = new Date();
			var seperator1 = "-";
			var month = date.getMonth() + 1;
			var strDate = date.getDate() - 1;
			
			if (month >= 1 && month <= 9) {
				month = "0" + month;
			}
			var currentdate = date.getFullYear() + seperator1 + month + seperator1
					+ strDate;
			return currentdate;
		},
		/***********************************************************************
		 * 验证合法手机号 
		 **********************************************************************/
		isMobile : function (str) {
			var reg = /^1[3|4|5|7|8][0-9]{9}$/;
			return reg.test($.trim(str)); 
		},
		/***********************************************************************
		 * URL地址是否合法
		 **********************************************************************/
		isURL : function (str) {
			var Expression=/http(s)?:\/\/([\w-]+\.)+[\w-]+(\/[\w- .\/?%&=]*)?/;
			var objExp=new RegExp(Expression);
			if(objExp.test(str)==true){
				return true;
			}else{
				return false;
			} 
		},
		/***********************************************************************
		 * 邮箱地址验证
		 **********************************************************************/
		isEmail : function (str) {
			//var reg = /^([a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+((\.[a-zA-Z0-9_-]{2,3}){1,2})$/; //open.wr.tjp@gmail.com验证不过
			var reg = new RegExp("^[a-z0-9]+([._\\-]*[a-z0-9])*@([a-z0-9]+[-a-z0-9]*[a-z0-9]+.){1,63}[a-z0-9]+$");
			return reg.test($.trim(str)); 
		},
		/***********************************************************************
		 * 检验IP地址
		 **********************************************************************/
		isIP : function (s) {
			var patrn=/^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/;
		    if (!patrn.exec(s)) return false 
		    return true 
		},
		/***********************************************************************
		 * 检验字符是否为QQ号
		 **********************************************************************/
		isQQ : function (aQQ) {
			var bValidate = RegExp(/^[1-9][0-9]{4,9}$/).test(aQQ);
			if (bValidate) {  
                return true;  
            } else {
                return false; 
            }
		},
		/***********************************************************************
		 * 检验字符是否为对象
		 **********************************************************************/
		isObj : function (obj) {
			if(typeof obj == "object"){
				return true;
			}else{
				return false;
			}
		},
		/***********************************************************************
		 * 检验字符是否是数字
		 **********************************************************************/
		isNumber : function(str) {
			var n = Number(str);
			if (!isNaN(n)) {
				return true;
			} else {
				return false;
			}
		},
		/***********************************************************************
		 * 检验字符是否是数字
		 **********************************************************************/
		isDigit : function (s) {
			var patrn=/^[0-9]{1,20}$/; 
			if (!patrn.exec(s) || s == "") {
				return false
			}else{
				return true 
			}
		},
		/*************************************************************
		 * 检验是否空
		 ************************************************************/
		isEmpty : function(s){
			if (s == null)
		        return true;
		    s = $.trim(s);
		    if (s == "")
		        return true;
		    else
		        return false;
		},
		/*************************************************************
		 * 检验是否数字
		 * 参数：
		 * 	s 需要校验的对象
		 **************************************************************/
		isFloat : function(s){
			var i;
		    var seenDot = false;

		    if (GlobalJSModule.isEmpty(s))
		        return false;
		    s = $.trim(s);
		    if (s.charAt(0) == ".")
		        return false;//一串数字不能"."打头
		    if (s.charAt(s.length - 1) == ".")
		        return false;//一串数字不能"."结尾
		    for (i = 0;i < s.length;i++) {
		        var c = s.charAt(i);
		        if ((c == ".") && !seenDot)//在没遇到"."前遇到时设标志
		            seenDot = true;
		        else if (!GlobalJSModule.isDigit(c))//不是数字或遇到第二个"."
		            return false;
		    }
		    if (s.charAt(0) == "0")//0打头
		        if (s.length > 1)//一串数字
		            if ((s.charAt(1) == ".") && (s.length > 2))//0.x
		                return true;
		            else
		                return false;//一串数字不能0打头
		        else
		            return true;//0
		    return true;
		},
		/*******************************************************
		 * 判断在数组中是否含有给定的一个变量值
 		 *	参数：
 		 *	obj：需要查询的值
 		 *	arr：被查询的数组
 		 *	在a中查询obj是否存在，如果找到返回true，否则返回false。
 		 *	此函数只能对字符和数字有效
 		 ********************************************************/
		contains : function(arr, obj){
			for (var i = 0;i < arr.length;i++) {
		        if (arr[i] === obj) {
		            return true;
		        }
		    }
		    return false;
		},
		/*******************************************************
		 * 判断在字符串中是否含有给定的一个子串
 		 *	参数：
 		 *	obj：被查询字符串
 		 *	target：目标字符串
 		 *	如果找到返回true，否则返回false。
 		 *	此函数只能对字符和数字有效
 		 ********************************************************/
		isContains : function(obj, target){
			if(obj.indexOf(target) > 0 ){
				 return true;
			} 
			return false;
		},
		
		/*******************************************************
		 * 查询元素在数组中的位置
		 *	参数：
		 *	obj：需要查询的值
		 *	arr：被查询的数组
		 *	在a中查询obj是否存在，如果找到返回 在数组中的idx值，否则返回-1
		 *	此函数只能对字符和数字有效
		 *
		 ******************************************************/
		arrIndexOf : function(arr, obj){
			var retValue = -1;
		    for (var i = 0;i < arr.length;i++) {
		        if (arr[i] === obj) {
		            retValue = i;
		            break;
		        }
		    }
		    return retValue;
		},
		/*******************************************************
		 * 制保留2位小数，如：2，会在2后面补上00.即2.00
		 *	参数：
		 *	x：需要格式化的值
		 *
		 ******************************************************/
		toDecimal2 : function(x) {
			if(GlobalJSModule.isEmpty(x)){
				return '0.00';
			}
			var f = parseFloat(x);
			if (isNaN(f)) {
				return false;
			}
			var f = Math.round(x * 100) / 100;
			var s = f.toString();
			var rs = s.indexOf('.');
			if (rs < 0) {
				rs = s.length;
				s += '.';
			}
			while (s.length <= rs + 2) {
				s += '0';
			}
			return s;
		},
		setShowLength : function(obj, maxlength, id) {
			var rem = maxlength - $('#'+obj).val().length;
			var wid = id;
			if (rem < 0) {
				rem = 0;
			}
			$('#'+wid).html("还可以输入<font color='red'>" + rem + "</font>字");
		},
		splitStr : function (str){
			var temp = str.split(/[\n,]/g);
			for (var i = 0; i < temp.length; i++) {
				if (temp[i] == "") {
					temp.splice(i, 1);
					// 删除数组索引位置应保持不变
					i--;
				}
			}
			return temp;
		},
		cleanArray : function(actual) {
			const
			newArray = []
			for (var i = 0; i < actual.length; i++) {
				if (actual[i]) {
					newArray.push(actual[i])
				}
			}
			return newArray
		},
		toQueryString : function(json){
			if(!json){
				return '';
			}
			
			var arr = [];
			jQuery.each(json, function(key,value){
				
				arr.push(encodeURIComponent(key) + '=' + encodeURIComponent(value));
			});
			
			return arr.join("&");
			
			 /*if (!json) return ''
			   return cleanArray(Object.keys(json).map(key , {
			     if (json[key] === undefined) return ''
			     return encodeURIComponent(key) + '=' +
			            encodeURIComponent(json[key])
			   })).join('&')*/
		}
		
	}

})();

jQuery(function () {
	GlobalJSModule.init();
});